/********************************************************************************
TITLE:                      	Formatted Output
FILENAME:                   	vector.h
PREPARED FOR:               	CS215 Section CS13-02
PROGRAMMER(S):              	Eric (Fox) Crowell, (Timothy Drye)
DEVELOPMENT DATE:           	< 12/15/13 >
COMPILER USED:      			Microsoft Visual Studio Professional 2013
- Version 12.0.21005.1 REL
TARGET PLATFORM:         	    Windows 8 x64
================================================================================
REVISION HISTORY

DATE         PROGRAMMER          DESCRIPTION OF CHANGES MADE
------------------------------------------------------------------------------
<12/15/13       Tim                 Class Created.                           >
<12/16/13       Fox                 Replaced with Lab3 vector class code     >
*******************************************************************************/

#ifndef VECTOR_H
#define VECTOR_H

#include <iostream>
using namespace std;

class Vector {

public:
	Vector(); // Default Constructor (initializes with hard-coded values). [Fox]
	Vector(double x, double y, double z); // A constructor that takes arguments for the vector x, y and, z values. [Fox]

	void setX(double value); // "x" data member setter [Fox]
	void setY(double value); // "y" data member setter [Fox]
	void setZ(double value); // "z" data member setter [Fox]

	double getX() const; // get "x" data member [Fox]
	double getY() const; // get "y" data member [Fox]
	double getZ() const; // get "z" data member [Fox]

	double magnitude() const; // Returns the magnitude of this vector [Fox]

	/* --- Multiplication --- */
	double operator*(const Vector &v) const; // double = Vector * Vector [Fox]
	Vector operator*(const double &s) const; // Vector = Vector * double [Fox]
	friend Vector operator*(const double &s, const Vector &v); // Vector = double * Vector [Fox]

	/* --- Addition --- */
	Vector operator+(const Vector &v) const; // Vector = Vector + Vector [Fox]
	Vector operator+(const double &s) const; // Vector = Vector + double [Fox]
	friend Vector operator+(const double &s, const Vector &v); // Vector = double + Vector [Fox]

	/* --- Subtraction --- */
	Vector operator-(const Vector &v) const; // Vector = Vector - Vector [Fox]
	Vector operator-(const double &s) const; // Vector = Vector - double [Fox]
	friend Vector operator-(const double &s, const Vector &v); // Vector = double - Vector [Fox]

	/* Negation */
	Vector & operator-(); // Vector = -Vector [Fox]

	/* --- Division --- */
	Vector operator/(const double &s) const; // Vector = Vector / double [Fox]

	/* --- Cross Product --- */
	Vector operator^(const Vector &v) const; // Vector = Vector ^ Vector [Fox]

	/* --- Equality --- */ 
	bool operator==(const Vector &v) const; // bool = Vector == Vector [Fox]

	/* --- Less-Than --- */
	bool operator<(const Vector &v) const; // bool = Vector == Vector [Fox]

	friend ostream& operator<<(std::ostream &out, const Vector &v);

private:
	double x; // x-coord [Fox]
	double y; // y-coord [Fox]
	double z; // z-coord [Fox]

};

#endif